#ifndef COMMON_H
#define COMMON_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>

#define MAX_CLIENTS 10
#define BUFFER_SIZE 1024
#define MAX_FILENAME 256
#define THREAD_POOL_SIZE 5

// 命令类型
typedef enum {
    CMD_UPLOAD,//上传
    CMD_DOWNLOAD,//下载
    CMD_LIST,//列出文件内容
    CMD_CONNECTIONS,//连接信息
    CMD_EXIT//退出
} CommandType;

// 传输数据结构
typedef struct {
    CommandType cmd;          // 命令类型
    char filename[MAX_FILENAME]; // 文件名
    long filesize;            // 文件大小
    int client_id;            // 客户端ID
} TransferData;

// 线程池任务
typedef struct {
    void (*function)(void *);   // 任务函数指针
    void *arg;                  // 传递给任务函数的参数
} ThreadPoolTask;

// 线程池结构
typedef struct {
    pthread_mutex_t lock;       // 互斥锁，用于保护线程池的共享资源
    pthread_cond_t notify;      // 条件变量，用于通知工作线程有新任务
    pthread_t *threads;         // 工作线程数组
    ThreadPoolTask *queue;      // 任务队列
    int thread_count;           // 工作线程的数量
    int queue_size;             // 任务队列的最大容量
    int head;                   // 任务队列的头部索引
    int tail;                   // 任务队列的尾部索引
    int count;                  // 当前任务队列中的任务数量
    int shutdown;               // 标志位，指示线程池是否正在关闭
} ThreadPool;

// 客户端连接信息
typedef struct {
    int sockfd;                // 客户端的套接字文件描述符
    struct sockaddr_in addr;   // 客户端的网络地址信息（IP地址和端口号）
    time_t connect_time;       // 客户端连接的时间戳
    int active;                // 客户端是否处于活跃状态（例如，是否正在通信）
} ClientInfo;

// 函数声明
ThreadPool *thread_pool_create(int thread_count, int queue_size);//函数用于创建一个线程池。函数接受两个参数：thread_count 表示线程池中线程的数量，queue_size 表示任务队列的大小
int thread_pool_add_task(ThreadPool *pool, void (*function)(void *), void *arg);
int thread_pool_destroy(ThreadPool *pool);//销毁线程函数
void *thread_pool_worker(void *arg);//工作线程函数

void handle_client(void *arg);//处理客户端请求函数
void send_file(int sockfd, const char *filename);//发送文件函数
void receive_file(int sockfd, const char *filename);//接收文件函数
void list_files(int sockfd);//列出服务器文件函数
void show_connections(int sockfd, ClientInfo *clients, int *client_count);
void print_progress(long current, long total);// 打印传输进度函数

#endif // COMMON_H